if (window.mkpGoogleScriptValidation != "running") { console.log("Running Google Reviews Script Updated"); window.mkpGoogleScriptValidation = "running"; window.runScriptGoogleReviews = function () { //*** Global Variables - Start */ // main endpoints const cdnBaseUrl = "https://mkp-prod.nyc3.cdn.digitaloceanspaces.com/google-reviews"; const backendUrl = "https://us-east1-goog-reviews-wix.cloudfunctions.net"; const appId = "f20b0377-bc3e-418d-9d73-2ac147543483"; const instanceId = document .getElementById("mkp_gg_reviews_script") .src.split("instance_id=")[1]; const vueScriptUrl = cdnBaseUrl + "/vue_widget/app.js"; // should placed in 'vue_widget/' directory const MKPGlobalVars = { cdnUrl: cdnBaseUrl, appId: appId, backendUrl: backendUrl, instanceId: instanceId, }; var MKPAfHttpClient = function () { this.get = function (aUrl, aCallback) { var anHttpRequest = new XMLHttpRequest(); anHttpRequest.onreadystatechange = function () { if (anHttpRequest.readyState == 4 && anHttpRequest.status == 200) aCallback(anHttpRequest.responseText); }; anHttpRequest.open("GET", aUrl, true); anHttpRequest.send(null); }; }; // Reviews data let filteredReviews = []; let reviewsStatistics = { reviews_count: 0, star_count: 0, overall_rating: "0.0", }; let filterOptions = { review_filter: "all", widget_flow: "only-badge", open_behavior: "click", }; let widgetData = [ { xxs: [ { widgetName: "review-widget_teaser", displayName: "Widget container", styles: { L_Bg_Padding: { top: 0, left: 0, bottom: 0, right: 0, }, D_Bg_PrimaryColor: "rgba(255, 255, 255, 0)", L_Btn_Direction: "horizontal", L_MinHeight: 40, ani_ShowAfter: 1.5, position_Left: 12, D_Bg_SecondaryColor: "rgba(46, 129, 255, 1)", position_Right: "unset", L_Bg_MobilePadding: { top: 0, left: 0, bottom: 0, right: 0, }, L_ElementGap: 0, L_MaxHeight: 300, position_Bottom: 12, ani_Type: "fade", D_Bg_Blur: 0, position_Top: "unset", D_Bg_BdrWidth: 0, L_Bg_CRadius: 6, D_Bg_BdrColor: "rgb(255, 255, 255)", position: "left-bottom", D_Bg_Enable_Gradient: false, L_MaxWidth: 320, L_Bdg_MobileLayout: "default-badge", mobilePosition: "center-bottom", L_Btn_MobileDirection: "horizontal", mobilePosition_Left: 0, mobilePosition_Right: 0, mobilePosition_Top: "unset", mobilePosition_Bottom: 12, }, id: "container", type: "widget", }, { iconName: "builder/icon-element-image", displayName: "Review badge", moved: false, h: 6, description: "HTML tag", i: "1", label: "Review badge", type: "review_badge", bdg_text_afterReviewCount: "REVIEWS", w: 4, x: 0, y: 0, styles: { D_Bdg_Enable_Gradient: false, D_Label_TextColor: "#f7802f", D_Bdg_SecondaryColor: "rgb(255, 255, 255)", L_Bdg_Template: "bdg_3", D_Bdg_BdrColor: "#e5e5e5", D_Bdg_IconFB_Color: "#1976d2", D_TextColor: "rgba(0, 0, 0, 1)", D_Label_FontSize: 18, L_Bdg_IconStr_Gap: 0, D_Label_Font_Formats: [], D_Label_TextFont: "Poppins", D_Bdg_IconStrOff_Color: "#d9d9d9", D_Bdg_Logo: "original_logo", D_FontSize: 12, L_Bdg_IconStr_Size: 25, L_Bdg_ElementGap: 0, D_BdgStars_Color: "rgba(255, 56, 92,1)", L_Bdg_IconFB_Size: 42, D_Bdg_BdrWidth: 1, D_ColorScheme: "color_1", D_Bdg_IconStrOn_Color: "#f7802f", D_Font_Formats: [], D_Bdg_PrimaryColor: "rgb(255, 255, 255)", L_Bdg_Radius: 6, L_Bdg_Padding: { top: 6, left: 12, bottom: 6, right: 12, }, D_TextFont: "Poppins", L_Bdg_Icon_Size: 42, }, id: "review_badge_0", reviews_overall: { overall_rating: "5", star_count: "158", reviews_count: "100", }, }, ], lg: [ { widgetName: "review-widget_teaser", displayName: "Widget container", styles: { L_Bg_Padding: { top: 0, left: 0, bottom: 0, right: 0, }, D_Bg_PrimaryColor: "rgba(255, 255, 255, 0)", L_Btn_Direction: "horizontal", L_MinHeight: 40, ani_ShowAfter: 1.5, position_Left: 12, D_Bg_SecondaryColor: "rgba(46, 129, 255, 1)", position_Right: "unset", L_Bg_MobilePadding: { top: 0, left: 0, bottom: 0, right: 0, }, L_ElementGap: 0, L_MaxHeight: 300, position_Bottom: 12, ani_Type: "fade", D_Bg_Blur: 0, position_Top: "unset", D_Bg_BdrWidth: 0, L_Bg_CRadius: 6, D_Bg_BdrColor: "rgb(255, 255, 255)", position: "left-bottom", D_Bg_Enable_Gradient: false, L_MaxWidth: 320, L_Bdg_MobileLayout: "default-badge", mobilePosition: "center-bottom", L_Btn_MobileDirection: "horizontal", mobilePosition_Left: 0, mobilePosition_Right: 0, mobilePosition_Top: "unset", mobilePosition_Bottom: 12, }, id: "container", type: "widget", }, { iconName: "builder/icon-element-image", displayName: "Review badge", moved: false, h: 6, description: "HTML tag", i: "1", label: "Review badge", type: "review_badge", bdg_text_afterReviewCount: "REVIEWS", w: 4, x: 0, y: 0, styles: { D_Bdg_Enable_Gradient: false, D_Label_TextColor: "#f7802f", D_Bdg_SecondaryColor: "rgb(255, 255, 255)", L_Bdg_Template: "bdg_3", D_Bdg_BdrColor: "#e5e5e5", D_Bdg_IconFB_Color: "#1976d2", D_TextColor: "rgba(0, 0, 0, 1)", D_Label_FontSize: 18, L_Bdg_IconStr_Gap: 0, D_Label_Font_Formats: [], D_Label_TextFont: "Poppins", D_Bdg_IconStrOff_Color: "#d9d9d9", D_Bdg_Logo: "original_logo", D_FontSize: 12, L_Bdg_IconStr_Size: 25, L_Bdg_ElementGap: 0, D_BdgStars_Color: "rgba(255, 56, 92,1)", L_Bdg_IconFB_Size: 42, D_Bdg_BdrWidth: 1, D_ColorScheme: "color_1", D_Bdg_IconStrOn_Color: "#f7802f", D_Font_Formats: [], D_Bdg_PrimaryColor: "rgb(255, 255, 255)", L_Bdg_Radius: 6, L_Bdg_Padding: { top: 6, left: 12, bottom: 6, right: 12, }, D_TextFont: "Poppins", L_Bdg_Icon_Size: 42, }, id: "review_badge_0", reviews_overall: { overall_rating: "5", star_count: "158", reviews_count: "100", }, }, ], }, ]; let widgetVisibility = { visibility_status: true, visibility_option: "home-only", }; let subscriptionPlan = "Free"; let connectedPage = { id: "", name: "", listingName: "", profilePictureURL: "", }; // Permission keys let isPreviewMode = false; /** flag use for hide widget in dashboard app web previews */ let isWidgetDataAvailable = true; // Detect initial page from URL to prevent widget flickering let isHomePage = window.location.pathname === "/" || window.location.pathname === ""; //*** Global Variables - End */ // Run functions console.log("🚀 Initializing Google Reviews Widget"); console.log("📋 Initial state:", { isHomePage, currentPath: window.location.pathname, instanceId: MKPGlobalVars.instanceId, }); bindGlobalVariables(); bindVueWidget(); mkpFetchReviewsData(); // checkAndAddWidgets(); //*** Functions - Start */ function bindGlobalVariables() { //Add main/global variables into head const MKPGlobalVarsScript = document.createElement("script"); MKPGlobalVarsScript.setAttribute( "MkpGoogleReviewsGlobalVars", JSON.stringify(MKPGlobalVars) ); MKPGlobalVarsScript.id = "MKP-GOOGLE-REVIEWS-GLOBAL-VARS"; document.head.appendChild(MKPGlobalVarsScript); } function bindVueWidget() { //Add vue widget .js and .css file into the head const MKPImportedVueComps = document.createElement("script"); MKPImportedVueComps.src = vueScriptUrl; document.head.appendChild(MKPImportedVueComps); } function mkpRegisterListener() { console.log("📊 Registering Wix Analytics listener"); window.wixDevelopersAnalytics.register( MKPGlobalVars.appId, (eventName, eventParams) => { switch (eventName) { case "PageView": const pagePath = eventParams.pagePath; const previousIsHomePage = isHomePage; isHomePage = pagePath === "/"; console.log("PageView Event:", { pagePath, isHomePage, previousIsHomePage, visibility_option: widgetVisibility.visibility_option, }); checkAndAddWidgets(); break; case "ViewContent": //isHomePage = pagePath === "/"; //checkAndAddWidgets(); break; } } ); } function mkpFetchReviewsData() { const backendUrl = MKPGlobalVars.backendUrl; const instance_id = `instance_id=${MKPGlobalVars.instanceId}`; const getReviewsDataUrl = `${backendUrl}/getMemberReviewsData?${instance_id}`; const mkpGetClient = new MKPAfHttpClient(); console.log("🔄 Fetching reviews data from backend..."); mkpGetClient.get(getReviewsDataUrl, function (res) { try { const reviewsData = JSON.parse(res); filteredReviews = reviewsData.filtered_reviews || filteredReviews; reviewsStatistics = reviewsData.reviews_statistics || reviewsStatistics; filterOptions = reviewsData.filter_options || filterOptions; widgetVisibility = reviewsData.widget_visibility || widgetVisibility; subscriptionPlan = reviewsData.subscription_plan || subscriptionPlan; connectedPage = reviewsData.fb_page || connectedPage; const backend_widgetData = reviewsData.widget_data; // Check backend data availability properly if (backend_widgetData && Array.isArray(backend_widgetData) && backend_widgetData.length > 0) { widgetData = backend_widgetData; isWidgetDataAvailable = true; } else { console.warn("⚠️ No widget_data from backend, using defaults"); isWidgetDataAvailable = false; } console.log("✅ Reviews data loaded:", { reviews_count: reviewsStatistics.reviews_count, rating: reviewsStatistics.overall_rating, visibility_status: widgetVisibility.visibility_status, visibility_option: widgetVisibility.visibility_option, widget_data_items: widgetData.length, subscription: subscriptionPlan, }); checkAndAddWidgets(); } catch (error) { console.error("❌ Error parsing reviews data:", error); console.log("📋 Using default widget configuration"); // Continue with defaults already set } }); } function checkAndAddWidgets() { mkpRemoveWidget(); const isWidgetActive = widgetVisibility.visibility_status === true; const isDataReady = filteredReviews.length > 0 && reviewsStatistics.reviews_count > 0; const visibleOnlyInHomePage = widgetVisibility.visibility_option === "home-only"; // Debug logging with all conditions console.log("🔍 Widget Check:", { isWidgetActive, isDataReady, reviews_count: filteredReviews.length, stats_count: reviewsStatistics.reviews_count, visibleOnlyInHomePage, isHomePage, currentPath: window.location.pathname, isPreviewMode, isWidgetDataAvailable, widgetData_length: widgetData ? widgetData.length : 0, subscription: subscriptionPlan, }); // Check all conditions - order matters if (!isWidgetActive) { console.log("❌ Widget hidden - visibility disabled by user"); return; } if (!isWidgetDataAvailable) { console.log("❌ Widget hidden - no widget configuration available"); return; } if (isPreviewMode) { console.log("❌ Widget hidden - preview mode active"); return; } if (!isDataReady) { console.log("❌ Widget hidden - no reviews data (count:", reviewsStatistics.reviews_count, ")"); return; } // Show widget based on visibility settings if (visibleOnlyInHomePage) { // Only show on home page if (isHomePage) { console.log("✅ Showing widget - home-only mode, on home page"); mkpShowReviewsWidget(); } else { console.log("❌ Widget hidden - home-only mode, not on home page (path:", window.location.pathname, ")"); } } else { // Show on all pages console.log("✅ Showing widget - all-pages mode"); mkpShowReviewsWidget(); } } function mkpShowReviewsWidget() { // Validate widget data structure before creating element if (!widgetData || widgetData.length < 2) { console.error("❌ Cannot create widget - invalid widgetData structure"); return; } let reviewsWidget = document.createElement("mkp-google-reviews"); console.log("🏗️ Creating widget element with data:", { reviews: filteredReviews.length, rating: reviewsStatistics.overall_rating, widget_flow: filterOptions.widget_flow, open_behavior: filterOptions.open_behavior, }); reviewsWidget.setAttribute("reviewdata", JSON.stringify(filteredReviews)); reviewsWidget.setAttribute( "reviewsstatistics", JSON.stringify(reviewsStatistics) ); reviewsWidget.setAttribute( "filterreviews", JSON.stringify(filterOptions) ); reviewsWidget.setAttribute( "connectedpage", JSON.stringify(connectedPage) ); // Widget data: [0] = main modal, [1] = teaser badge const mainModalStyleData = JSON.stringify(widgetData[0]); const teaserStyleData = JSON.stringify(widgetData[1]); reviewsWidget.setAttribute("mainstyledata", mainModalStyleData); reviewsWidget.setAttribute("teaserstyledata", teaserStyleData); document.body.appendChild(reviewsWidget); console.log("📍 Widget element created and added to page"); // Verify widget was added to DOM setTimeout(() => { const widgetExists = document.querySelector("mkp-google-reviews"); if (widgetExists) { console.log("🔎 Widget verification: ✅ Found in DOM"); } else { console.warn("⚠️ Widget verification: Widget not found in DOM after creation"); } }, 100); } function mkpRemoveWidget() { let reviewsWidget = document.querySelector("mkp-google-reviews"); if (reviewsWidget) { reviewsWidget.remove(); console.log("🗑️ Widget removed from page"); } } function previewScreenCheckEvent(event) { // remove widget in preview mode if (event.data.action === "mkpHideWidget") { console.log("👁️ Preview mode detected - hiding widget"); isPreviewMode = true; mkpRemoveWidget(); } } //*** Functions - End */ // check is widget page in the preview mode window.addEventListener("message", previewScreenCheckEvent); // Remove the event listener after 15 seconds setTimeout(() => { window.removeEventListener("message", previewScreenCheckEvent); console.log("⏱️ Preview mode event listener removed after 16s"); }, 16000); // Register analytics listener if (window.wixDevelopersAnalytics) { console.log("✅ Wix Analytics already available"); mkpRegisterListener(); } else { console.log("⏳ Waiting for Wix Analytics to be ready..."); window.addEventListener( "wixDevelopersAnalyticsReady", mkpRegisterListener ); } }; window.runScriptGoogleReviews(); }